#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
using namespace std;

// class Alternate
// {
// private:
//     pthread_mutex_t mtx;
//     pthread_cond_t cond1;
//     pthread_cond_t cond2;
// public:
//     Alternate()
//     {
//         pthread_mutex_init(&mtx, nullptr);
//         pthread_cond_init(&cond1, nullptr);
//         pthread_cond_init(&cond2, nullptr);
//     }

// };
pthread_mutex_t mtx;
pthread_cond_t cond1;
pthread_cond_t cond2;
int flag = 0;
void* funA(void* a)
{
    while(true)
    {
        pthread_mutex_lock(&mtx);
        while(flag == 1)
            pthread_cond_wait(&cond2, &mtx);
        std::cout<<"我是线程A"<<std::endl;
        flag=1;
        pthread_cond_signal(&cond1);
        pthread_mutex_unlock(&mtx);
        sleep(1);
    }
}
void* funB(void* b)
{
    while(true)
    {
        pthread_mutex_lock(&mtx);
        while(flag == 0)
            pthread_cond_wait(&cond1, &mtx);
        std::cout<<"我是线程B"<<std::endl;
        flag = 0;
        pthread_cond_signal(&cond2);
        pthread_mutex_unlock(&mtx);

        sleep(1);
    }
}
int main()
{
    //Alternate* alt = new Alternate();
    pthread_mutex_init(&mtx, nullptr);
    pthread_cond_init(&cond1, nullptr);
    pthread_cond_init(&cond2, nullptr);
    pthread_t A;
    pthread_t B;
    pthread_create(&A,nullptr, funA, (void*)"A");
    pthread_create(&B,nullptr, funB, (void*)"B");

    pthread_join(A,nullptr);
    pthread_join(B,nullptr);
    //delete alt;
    return 0;
}